package DP;

import java.util.Scanner;

/**
 * @author dx
 * @version 1.0
 * @date 2022/5/15 17:30
 * @description: 剑指offer 48 最长不含重复字符的子字符串
 */
public class LongestSubWithDup {
    public static void main(String[] args) {
        Scanner sr = new Scanner(System.in);
        String s = sr.next();
        new longestSub_Soultion().longsub(s);
    }
}
class longestSub_Soultion{

    public void longsub(String s){
        int max = -1,len;
        len = s.length();
        int []position = new int[26];
        for(int i = 0;i < 26;i++){
            position[i] = -1;
        }
        int []dp = new int[len];  //dp[i]表示第i位置上最长不重复字符的长度 dp[1] = dp[0]+1(不重复的情况下)，那么dp[0]设为0
        dp[0] = 1;
        for(int i = 0;i < len;i++){
            if(i == 0){
                dp[i] = dp[0];
                position[s.charAt(i)-'a'] = i;
                max = Math.max(max,dp[i]);
                continue;
            }
            int index = position[s.charAt(i)-'a']; //获取该字符出现的索引，如没有出现过则是-1
            if(index < 0  ||  i - index > dp[i-1]){   //index<0 说明没有重复出现
                dp[i] = dp[i-1]+1;
            }
            else{
                if(i - index <= dp[i -1]){   //如果当前索引减去上次该字符出现的索引小于等于上一个的最长不重复字符的长度 说明上次的字符是出现在dp[i-1]里的
                    dp[i] = i - index;
                }
            }
            position[s.charAt(i) - 'a'] = i;  //记录该字符出现过
            max = Math.max(max,dp[i]);
        }
        System.out.println(max);
    }
}
